package gccshop.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//数据库连接类
public class DbConn {
	// 定义一个静态局部量
	private Connection conn = null;
	private PreparedStatement pt = null;
	private ResultSet rs = null;

	// 构造函数
	public DbConn() {
		// try..catch错误捕捉
		try {
			// 加载驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			// 根据账号密码远程连接数据库
			conn = DriverManager.getConnection(
					"jdbc:mysql://139.199.205.212:3306/u1", "stu", "12345678");
		} catch (ClassNotFoundException e) {
			System.out.println("没有加载到驱动程序");
		} catch (SQLException e) {
			System.out.println("连接出错");
		}
	}

	// 获取连接，仅给测试用
	public Connection getConn() {
		return conn;
	}

	/**
	 * 通用增删改
	 * 
	 * sql:需要执行的任何sql语句
	 * 
	 * objects：要植入到prepareStatement中去的参数对象数组
	 * 
	 * result:受影响的记录数
	 */
	public int update(String sql, Object[] objects) {
		int result = 0;
		try {
			pt = conn.prepareStatement(sql);
			// System.out.println("dbconn:" + objects);
			if (objects != null) {
				for (int i = 0; i < objects.length; i++) {
					pt.setObject(i + 1, objects[i]); // 下标从1开始的
				}
			}
			// System.out.println("dbconn:" + pt);
			result = pt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 通用查询
	 * 
	 * sql:需要执行的任何sql语句
	 * 
	 * objects：要植入到prepareStatement中去的参数对象数组
	 * 
	 * rs:返回的查询结果，记录集
	 */
	public ResultSet query(String sql, Object[] objects) {
		try {
			pt = conn.prepareStatement(sql);
			if (objects != null) {
				for (int i = 0; i < objects.length; i++) {
					pt.setObject(i + 1, objects[i]);
				}
			}
			rs = pt.executeQuery();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rs;
	}

	// 全字段查询符合条件的记录总数，即所有字段匹配要查询的内容
	// 免除用户选择关键字
	/*
	 * tableName:要查询的表名
	 * 
	 * findKeys:要查询的关键字数组
	 * 
	 * findValue:要模糊查询的匹配词
	 */
	public int findTotal(String tableName, String[] findKeys, String findValue) {
		String sql = "select count(*) from " + tableName;
		sql += " where " + findKeys[0] + " like '%" + findValue + "%'";
		if (findKeys.length > 1) {
			for (int i = 1; i < findKeys.length; i++) {
				sql += " or " + findKeys[i] + " like '%" + findValue + "%'";
			}
		}
		// System.out.println("dbconn:"+sql);
		int records = 0;
		try {
			rs = query(sql, null);// 原来用父类的query，现在用自己的
			if (rs.next()) {
				records = rs.getInt(1);
			}
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} finally {
			try {
				closeConn();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return records;
	}

	// 关闭连接
	public void closeConn() throws SQLException {

		// if (rs != null)
		// rs.close();
		// if (pt != null)
		// pt.close();
	}
}
